package com.example.demo.common;

import org.apache.tomcat.util.digester.Digester;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 密码工具类
 */

public class PasswordUtils {
    /**
     * 加盐加密
     *
     * @param password
     * @return
     */
    public static String encrypt(String password) {
        // 1、生成一个盐值；
        String salt = UUID.randomUUID().toString().replace("-", "");
        // 2、（根据盐值+固定密码）使用MD5进行加密 = 最终密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        // 3、将盐值和最终密码+ $符 进行返回
        return salt + "$" + finalPassword;

    }

    /**
     * 加盐验证
     *
     * @param password 待验证密码(一般来说是用户输入的密码，但也有更复杂的情况）
     * @param dbpwd    数据库中的密码=盐值+分隔符+最终密码
     * @return
     */
    public static boolean decrypt(String password, String dbpwd) {
        // 参数验证
        if (!StringUtils.hasLength(password) || !StringUtils.hasLength(dbpwd)
                || dbpwd.length() != 65) {
            return false;
        }
        // 1、得到盐值
        String[] dbPwdArrary = dbpwd.split("\\$"); //$是一个正则表达式的特殊字符需要转移
        // 与 $ 符分割完后是前面一部分后面一部分
        if (dbPwdArrary.length != 2) {
            return false;
        }
        // 盐值
        String salt = dbPwdArrary[0];
        // 最终正确密码
        String finalDbPwd = dbPwdArrary[1];
        // 2、加密待验证的密码（因为 MD5 不可逆）
        String finalPwd = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        // 3、对比是否相同
        if (finalPwd.equals(finalDbPwd)) {
            return true;
        }
        return false;
    }

    public static void main11(String[] args) {
//        System.out.println(encrypt("123"));

        String dbPassword = "67439814db0d4d9a8e89ad2b017f41cf$5470de697bc55bddb4d8b05ea84ea241";
        System.out.println("正确："+decrypt("123",dbPassword));
        System.out.println("错误："+decrypt("1233",dbPassword));
    }
}
